#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

bool isReflexive(int size, bool** sample)  //自反性
{
    for (int i = 0; i < size; i++)
    {
        if (!sample[i][i])
        {
            return false;
        }
    }
    return true;
}

bool isSymmetric(int size,bool** sample)  //对称性
{
    for (int i = 0; i < size; i++)
    {
        for(int j = 0; j < size; j++)
        {
            if(sample[i][j] != sample[j][i])
            {
                return false;
            }
        }
    }
    return true;
}

bool isTransitive(int size, bool** sample)  //传递性
{
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            if(sample[i][j])                 //如果i和j之间有关系
            {
                for(int k = 0; k < size; k++)
                {
                    if(sample[j][k] && !sample[i][k])   //ij,jk有关系但ik没有关系则不具有传递性
                    {
                        return false;
                    }
                }
            }
        }
    }
    return true;
}

int main()
{
    int size;
    printf("请输入元素个数：\n");
    scanf("%d",&size);

    //动态开辟关系矩阵
    bool **sample = (bool**)malloc(size * sizeof(bool*));
    for (int i = 0; i < size; i++)
    {
        sample[i] = (bool*)malloc(size * sizeof(bool));
    }

    printf("请输入关系矩阵\n");
    for (int i = 0; i < size; i++)
    {
        for(int j = 0; j < size; j++)
        {
          int input;
          scanf("%d", &input);
          sample[i][j] = input; // 将输入的整数转换为布尔值
        }
    }

    //输出结果
    printf("自反性: %s\n", isReflexive(size, sample) ? "true" : "false");
    printf("对称性: %s\n", isSymmetric(size, sample) ? "true" : "false");
    printf("传递性: %s\n", isTransitive(size, sample) ? "true" : "false");

    //释放空间
    for (int i = 0; i < size; ++i) 
    {
        free(sample[i]);
    }
    free(sample);

    return 0;
}
